Inverted Table Index Of R←X(8⌶)Y

This function computes X index-of Y (viz. X⍳Y) where X and Y are compatible inverted tables. R is the indices of Y in X.

An inverted table is a (nested) vector all of whose items have the same number of major cells. That is, 1=⍴⍴⍵ and (≢⊃⍵)=≢¨⍵. An inverted table representation of relational data is more efficient in time and space than other representations.

The following is an example of an inverted table:

      X←(10 3⍴⎕a) (⍳10) 'metalepsis'
      X
┌───┬───────────────────┬──────────┐
│ABC│0 1 2 3 4 5 6 7 8 9│metalepsis│
│DEF│                   │          │
│GHI│                   │          │
│JKL│                   │          │
│MNO│                   │          │
│PQR│                   │          │
│STU│                   │          │
│VWX│                   │          │
│YZA│                   │          │
│BCD│                   │          │
└───┴───────────────────┴──────────┘

Using inverted tables, it is often necessary to perform a table look-up to find the "row" indices of one in another. Suppose there is a second table Y:

      Y←(⊂⊂3 1 4 1 5 9)⌷¨X
      Y
 GHI  3 1 4 1 5 9  tmamli 
 ABC                      
 JKL                      
 ABC                      
 MNO                      
 YZA  

To compute the indices of Y in X using dyadic , it is necessary to first un-invert each of the tables in order to create nested matrices that can handle.

      unvert ← {⍉↑⊂⍤¯1¨⍵}
      unvert X
┌───┬─┬─┐
│ABC│0│m│
├───┼─┼─┤
│DEF│1│e│
├───┼─┼─┤
│GHI│2│t│
├───┼─┼─┤
│JKL│3│a│
├───┼─┼─┤
│MNO│4│l│
├───┼─┼─┤
│PQR│5│e│
├───┼─┼─┤
│STU│6│p│
├───┼─┼─┤
│VWX│7│s│
├───┼─┼─┤
│YZA│8│i│
├───┼─┼─┤
│BCD│9│s│
└───┴─┴─┘

      (unvert X) ⍳ (unvert Y)
3 1 4 1 5 9

Each un-inverted table requires considerably more workspace than its inverted form, so if the inverted tables are large, this operation is potentially expensive in terms of both time and workspace.

8⌶ is an optimised version of the above expression.

      X (8⌶) Y
3 1 4 1 5 9